<?php

/**
 * Permet de faire le lien entre les objets métier et leur persistance 
 */
class ZendTremplin_Model_UserMapper {

    protected $_dbTable;

    /**
     * Fixe le DbTable de l'objet
     * @param type $dbTable
     * @return \ZendTremplin_Model_DbTable_User
     * @throws Exception 
     */
    public function setDbTable($dbTable) {
        if (is_string($dbTable)) {
            $dbTable = new $dbTable();
        }
        if (!$dbTable instanceof Zend_Db_Table_Abstract) {
            throw new Exception('Invalid table data gateway provided');
        }
        $this->_dbTable = $dbTable;
        return $this;
    }

    /**
     * Retourne le DbTable associé à l'objet
     * @return type 
     */
    public function getDbTable() {
        if (null === $this->_dbTable) {
            $this->setDbTable('ZendTremplin_Model_DbTable_User');
        }
        return $this->_dbTable;
    }

    /**
     * Sauvegarde un objet en base de données. Si l'objet existait déjà en base, il est 
     * mis à jour, sinon un nouveau est créé
     * @param ZendTremplin_Model_User $user 
     */
    public function save(ZendTremplin_Model_User $user) {
        $data = array(
            'login' => $user->getLogin(),
            'pwd' => $user->getPwd()
        );

        if (($id = $user->getId()) === null) {
            $this->getDbTable()->insert($data);
        } else {
            $this->getDbTable()->update($data, array('id = ?' => $id));
        }
    }

    /**
     * Récupère un user depuis la base de données
     * @param type $id
     * @return ZendTremplin_Model_User ou NULL si non trouvé
     */
    public function findById($id) {
        $result = $this->getDbTable()->find($id);
        if (count($result) == 0) {
            return NULL;
        }
        return $this->rowToUser($result->current());
    }

    /**
     * Récupère un user depuis la base de données
     * @param string $login 
     * @return ZendTremplin_Model_User ou NULL si non trouvé
     */
    public function findByLogin($login) {
        $select = $this->getDbTable()->select()->where('login = ?', $login)->limit(1, 0);
        $row = $this->getDbTable()->fetchRow($select);
        return ($row === NULL) ? NULL : $this->rowToUser($row);
    }

    /**
     * Vérifie si le user a le droit de se connecter
     * @param string $login
     * @param string $pwd
     * @return boolean 
     */
    public function isRightCombination($login, $pwd) {
        $select = $this->getDbTable()->select()->where('login = ?', $login)->where('pwd = ?', $pwd);
        $result = $this->getDbTable()->fetchRow($select);
        return $result != NULL;
    }

    /**
     * Vérifie si le user est déjà présent en base de données
     * @param string $login
     * @return boolean 
     */
    public function isPresentLogin($login) {
        return ($this->findByLogin($login) === NULL) ? false : true;
    }

    /**
     * Transforme une ligne de base de données en un user
     * @param type $row
     * @return type 
     */
    private function rowToUser($row) {
        $user = new ZendTremplin_Model_User();
        $user->setId($row['id']);
        $user->setLogin($row['login']);
        $user->setPwd($row['pwd']);
        return $user;
    }

}

